// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.chat_root.sendlocation;

import android.animation.ObjectAnimator;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.amap.api.location.AMapLocation;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.WidgetUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.chat_root.model.LocationMeta;
import com.x52im.rbchat.logic.chat_root.sendlocation.impl.GetLocationPOIListAdapter;
import com.x52im.rbchat.logic.chat_root.sendlocation.impl.GetLocationPOIListUIWrapper;
import com.x52im.rbchat.logic.chat_root.sendlocation.impl.GetMyselfLocationWrapper;
import com.x52im.rbchat.logic.chat_root.sendlocation.utils.LocationOnItemClickLisenter;
import com.x52im.rbchat.logic.chat_root.sendlocation.utils.LocationUtils;
import com.x52im.rbchat.permission2.PermissionManager;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.BroadcastToolKits;

import java.io.File;
import java.text.MessageFormat;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
 * 获取地图位置的实现类。
 *
 * 有关高德地图的开发者手册，请见：https://lbs.amap.com/api/android-sdk/summary
 * 本类的原始代码来自开源工程：https://github.com/xiaofuchen/WeixinLocation
 *
 * @author 原作者：xiaofuchen, 优化和修订：JackJiang
 * @since 6.0
 */
public class GetLocationActivity extends DataLoadableActivity
{
    private final static String TAG = GetLocationActivity.class.getSimpleName();

    /** 当前定位所对应的PIO兴趣点列表的wrapper包装类 */
    private GetLocationPOIListUIWrapper getLocationPOIListUIWrapper;
    /** 获取我自已的当前位置定位的wrapper包装类 */
    private GetMyselfLocationWrapper getMyselfLocationWrapper;

    private Button          mIvSearch;
    private Button          mBtnOK;

    /** 地图主视图 */
    private MapView         mMapView;
    /** 回到"我自已的当前位置"组件 */
    private ImageView       mIvBackMySelfLocation;
    /** 中心"大头针"组件 */
    private ImageView       mIvCenterPin;

    /** 当前被选中的位置 */
    private PoiItem         currentSelectedPoiItem;

    private AMap            mAMap;
    /** "我自已的当前位置"地图标记 */
    private Marker          mMyselfLocationMarker;
    private PoiSearch       mPoiSearch;
    private PoiSearch.Query mQuery;
    /** 是否搜索地址数据 */
    private boolean         isSearchData = false;
    /** Poi搜索最大页数，可应用于上拉加载更多 */
    private int             searchAllPageNum;
    /** 当前poi搜索页数 */
    private int             searchNowPageNum;
    /** 默认地图缩放级别 */
    private float           zoom         = 14;

    private MyOnPoiSearchLintener                 mMyOnPoiSearchListener;
    private View.OnClickListener                  mOnClickListener;
    private GeocodeSearch.OnGeocodeSearchListener mMyOnGeocodeSearchListener;

    /** 地图中心"大头针"标志的跳动动画 */
    private ObjectAnimator mCentPinAnimator;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        initPermission();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    public void onPause()
    {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
        finish();
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();

        getMyselfLocationWrapper.stopLocation();
        mMapView.onDestroy();
        mPoiSearch = null;
        getMyselfLocationWrapper.onDestroy();
    }

    @Override
    protected void initViews(Bundle savedInstanceState)
    {
        //设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
        customeTitleBarResId = R.id.chatting_get_location_activity_titleBar;
        setContentView(R.layout.chatting_get_location_activity2);

        this.setTitle("选择位置");

        mIvSearch = this.getCustomeTitleBar().getLeftGeneralButton();//findViewById(R.id.chatting_get_location_activity_iv_search);
        mBtnOK = this.getCustomeTitleBar().getRightGeneralButton();//findViewById(R.id.chatting_get_location_activity_bt_send);

        // 标题栏右边的"发送"按钮ui设置
        mBtnOK.setVisibility(View.VISIBLE);
        // 设置按钮衬距
        WidgetUtils.setMargins(mBtnOK, 0, 0, WidgetUtils.dip2px(this, 15.0f), 0);
        // 设置按钮高度
        WidgetUtils.setHeight(mBtnOK, WidgetUtils.dip2px(this, 32.0f));
        mBtnOK.setText("发送");
        _setOkButtonEnable(false);

        // 标题栏右边的"搜索"图标按钮ui设置
        mIvSearch.setVisibility(View.VISIBLE);
        mIvSearch.setBackgroundResource(R.drawable.common_title_btn_search);

        mMapView = findViewById(R.id.chatting_get_location_activity_map);
        mIvBackMySelfLocation = findViewById(R.id.chatting_get_location_activity_iv_back_myself_location);
        mIvCenterPin = findViewById(R.id.chatting_get_location_activity_iv_center_pin);

        getLocationPOIListUIWrapper = new GetLocationPOIListUIWrapper(this){
            @Override
            protected void afterAdapterSetSelectPosition() {
                int position = mAddressListAdapter.getSelectPositon();
                _setOkButtonEnable(position >= 0);
            }
        };
        getMyselfLocationWrapper = new GetMyselfLocationWrapper(this,false) {
            @Override
            protected void whenLocationSucess() {
                doWhenMyselfLocationSucess();
            }
            @Override
            protected void showHint(String hint) {
                getLocationPOIListUIWrapper.showHintContent(hint);
            }
        };

        // 此方法必须重写
        mMapView.onCreate(savedInstanceState);
        mAMap = mMapView.getMap();

        //是否显示地图中放大缩小按钮
        mAMap.getUiSettings().setZoomControlsEnabled(false);
        // 是否显示默认的定位按钮
        mAMap.getUiSettings().setMyLocationButtonEnabled(false);
        //是否显示缩放级别
        mAMap.getUiSettings().setScaleControlsEnabled(true);
        // 是否可触发定位并显示定位层
        mAMap.setMyLocationEnabled(false);
//        // 是否显示指南针
//        mAMap.getUiSettings().setCompassEnabled(true);
        // 开启双指倾斜手势
        mAMap.getUiSettings().setTiltGesturesEnabled(true);

        // 地图中央的"大头针"上下跳动动画
        mCentPinAnimator = ObjectAnimator.ofFloat(mIvCenterPin, "translationY", 0f, -80f, 0f);
        mCentPinAnimator.setDuration(800);
//        mCentPinAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners()
    {
        // 监测地图画面的移动事件监听器
        mAMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
            @Override
            public void onCameraChangeFinish(CameraPosition cameraPosition)
            {
                if (null != getMyselfLocationWrapper.getCurrentLocation() && null != cameraPosition && isSearchData)
                {
                    mIvBackMySelfLocation.setImageResource(R.drawable.chatting_location_gps_black);
                    zoom = cameraPosition.zoom;

                    // 获得中心点坐标，并通过逆地理搜索找到PIO列表
                    LatLng target = cameraPosition.target;
                    doGetAddressListByLatLong(target.latitude, target.longitude);

                    // "跳动"大头针
                    startCenterPinAnimator();
                }

                if (!isSearchData)
                    isSearchData = true;
            }

            @Override
            public void onCameraChange(CameraPosition cameraPosition) {
            }
        });

        // 设置触摸地图事件监听器
        mAMap.setOnMapClickListener(new AMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                isSearchData = true;
            }
        });

        // Poi搜索结果监听器，用于移动地图中心点时，自动搜索新中心点的POI列表
        mMyOnPoiSearchListener = new MyOnPoiSearchLintener();

        // 逆地址搜索监听器，用于进入本界面时，定位完成当前位置后，根据当前位置进行逆地理搜索找到POI列表
        mMyOnGeocodeSearchListener = new GeocodeSearch.OnGeocodeSearchListener() {
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i)
            {
                Log.w(TAG, ">>>>>>>>>>> onRegeocodeSearched 返回了，i="+i);

                // 返回码1000表示成功（详见高德地图开发者手册）
                if (i == 1000)
                {
                    if (regeocodeResult != null)
                    {
                        getLocationPOIListUIWrapper.showContent(GetLocationPOIListUIWrapper.ContentType.data);

                        currentSelectedPoiItem = LocationUtils.changeToPoiItem(regeocodeResult);

                        List<PoiItem> listDatas = getLocationPOIListUIWrapper.getListDatas();
                        if(listDatas != null)
                            listDatas.clear();

                        // 注意：从逆地址搜索中得到的Pois列表中的POIItem的省市区字段都是空的！

                        listDatas.addAll(regeocodeResult.getRegeocodeAddress().getPois());

                        // 移动到的位置，放在列表的第1条
                        if (null != currentSelectedPoiItem)
                            listDatas.add(0, currentSelectedPoiItem);

                        // 刷新界面显示
                        getLocationPOIListUIWrapper.notifyDataSetChanged();
                        // 默认选中第一条
                        getLocationPOIListUIWrapper.getAddressListAdapter().setSelectPosition(0);
                    }
                    else
                        getLocationPOIListUIWrapper.showHintContent("返回的结果为空");
                }
                else
                    getLocationPOIListUIWrapper.showHintContent(LocationUtils.getSearchResponseErrorCodeDesc(i));
            }

            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
            }
        };

        // POI地址列表的点击事件监听器
        getLocationPOIListUIWrapper.getAddressListAdapter().setOnItemClickLisenter(new LocationOnItemClickLisenter() {
            @Override
            public void onItemClick(int position)
            {
                try
                {
                    isSearchData = false;
                    mIvBackMySelfLocation.setImageResource(R.drawable.chatting_location_gps_black);

                    PoiItem item = getLocationPOIListUIWrapper.getListDatas().get(position);
                    moveMapCamera(item.getLatLonPoint().getLatitude(), item.getLatLonPoint().getLongitude());
                }
                catch (Exception ex)
                {
                    Log.w(TAG, ex);
                    Toast.makeText(GetLocationActivity.this, "未知错误！", Toast.LENGTH_LONG).show();
                }
            }
        });

        // 各UI控件点击监听器
        mOnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                List<PoiItem> listDatas = getLocationPOIListUIWrapper.getListDatas();

                switch (view.getId())
                {
                    case R.id.widget_title_left_generalBtn:
                    {
                        startActivityForResult(new Intent(GetLocationActivity.this
                                , SearchLocationActivity.class), ActivityRequestCode.REQUEST_CODE_FOR_SEARCH_LOCATION);
                        break;
                    }
                    case R.id.chatting_get_location_activity_iv_back_myself_location:
                    {
                        mIvBackMySelfLocation.setImageResource(R.drawable.chatting_location_gps_red);

                        if (null == getMyselfLocationWrapper.getCurrentLocation()) {
                            getMyselfLocationWrapper.startLocation();
                        } else {
                            doWhenMyselfLocationSucess();
                        }
                        break;
                    }
                    case R.id.widget_title_right_generalBtn:
                    {
                        GetLocationPOIListAdapter listAdapter = getLocationPOIListUIWrapper.getAddressListAdapter();
                        final LocationMeta lm = listAdapter.getSelectedItem();

                        Log.w(TAG, "【位置截图】AAAAAA");

                        // 预览图的文件名（本地保存的名）
                        final String fileName = LocationUtils.generateLocationPreviewFileName();
                        lm.setPrewviewImgFileName(fileName);

                        if(fileName != null)
                        {
                            // 设置此marker不可见，不然高德地图的截屏功能会把它也截进去，预览图就有点难看了
                            mMyselfLocationMarker.setVisible(false);

                            // 对地图进行截屏：
                            // @see http://lbs.amap.com/api/android-sdk/guide/interaction-with-map/map-screenshot
                            // @see http://a.amap.com/lbs/static/unzip/Android_Map_Doc/index.html
                            mAMap.getMapScreenShot(new AMap.OnMapScreenShotListener() {

                                @Override
                                public void onMapScreenShot(Bitmap bitmap) {
                                }

                                @Override
                                public void onMapScreenShot(Bitmap bitmap, int status) {

                                    Log.w(TAG, "【位置截图】BBBBB");

                                    Object[] saveResults = LocationUtils.saveMapScreenShot(bitmap, status, lm.getLocationTitle(), fileName);
                                    if(saveResults != null)
                                    {
                                        boolean saveSucess = (boolean)saveResults[0];
                                        File screenShotSavedFile = (File)saveResults[1];

                                        if(saveSucess)
                                        {
                                            if(screenShotSavedFile != null)
                                            {
                                                // (1)发送广播："位置"消息中的预览截图保存完成时的广播通知：
                                                //   》由于高德地图的位置预览截图功能是由高德地图库内部完成，且是完全异步——不受开发者的程序控制，
                                                //   》那么存在一个问题：即当位置消息指令已经发出时(只需很短的时间)，而此截图很可能还并保存完成
                                                //   》(尤其在一些低端机型上)，为了解决这个问题，就是在此图保存完成时发出一个广播，UI界面收到时
                                                //   》强行刷新一次，就能弥补本地刚才未加载到此预览图的问题了. 》
                                                BroadcastToolKits.locationMsgPreviewImgUploaded_SEND(GetLocationActivity.this, screenShotSavedFile.getName());

                                                // (2)上传到服务端
                                                new LocationUtils.LocationPreviewUploaderAsync(MyApplication.getInstance2())
                                                        .execute(screenShotSavedFile.getAbsolutePath(), screenShotSavedFile.getName());
                                            }
                                            else
                                                Log.w(TAG, "【位置截图-onMapScreenShot】saveMapScreenShot()方法返回的File对象是空，预览图上传无法继续。");
                                        }
                                        else
                                            Log.w(TAG, "【位置截图-onMapScreenShot】截图保存文件失败，预览图上传无法继续。");
                                    }
                                    else
                                        Log.w(TAG, "【位置截图-onMapScreenShot】saveMapScreenShot()方法的返回结果为空，预览图上传无法继续。");


                                    // 设置置回调数据并关闭本界面（因为要进行截图，为了确保截图能在关闭
                                    // 本界面前完成，而将以下回调和关闭放到onMapScreenShot里了）
                                    Intent intent = new Intent();
                                    intent.putExtra("selected_location", lm);
                                    setResult(RESULT_OK, intent);
                                    Log.w(TAG, "【位置截图】DDDDDD-x");
                                    finish();
                                    Log.w(TAG, "【位置截图】EEEEEE-x");
                                }
                            });
                        }
                        else
                            Log.w(TAG, "【位置截图-onMapScreenShot】生成的fileName为空，位置预览图无法成功保存哦！");

                        Log.w(TAG, "【位置截图】CCCCC");

//                        if(lm != null)
//                            Toast.makeText(GetLocationActivity.this
//                                    , "发送：" + lm.getLocationTitle() + " ," + lm.getLocationContent() + " ,"
//                                            + "经度：" + lm.getLongitude() + "，" + "纬度：" + lm.getLatitude(), Toast.LENGTH_SHORT).show();
//                        // 设置置回调数据
//                        Intent intent = new Intent();
//                        intent.putExtra("selected_location", lm);
//                        setResult(RESULT_OK, intent);
//
//                        Log.w(TAG, "【位置截图】DDDDDD");
//                        finish();
//                        Log.w(TAG, "【位置截图】EEEEEE");
                        break;
                    }
                }
            }
        };

//        mIvBack.setOnClickListener(mOnClickListener);
        mIvSearch.setOnClickListener(mOnClickListener);
        mIvBackMySelfLocation.setOnClickListener(mOnClickListener);
        mBtnOK.setOnClickListener(mOnClickListener);
    }

    private void initPermission()
    {
        // 开始动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）
        PermissionManager.requestPermission_LOCATION(this
                // 权限获取成功或已经取得此权限时
                , new Observer() {
                    @Override
                    public void update(Observable o, Object arg) {

                        //** 权限正常获取，走正常的代码逻辑。。。

                        // 开始定位
                        getMyselfLocationWrapper.startLocation();
                    }
                }
                // 用户拒绝或权限获取失败时
                , new Observer(){
                    @Override
                    public void update(Observable o, Object permissionNamesObj) {

                        final List<String> permissionNames = (List<String>)permissionNamesObj;
                        String message = MessageFormat.format($$(R.string.rb_permission_setting_content)
                                , com.eva.android.ToolKits.getAppName(GetLocationActivity.this), permissionNames);

                        // 显示提示信息
                        getLocationPOIListUIWrapper.showHintContent(message);
                    }
                });
    }

    @Override
    protected DataFromServer queryData(String... params) {
        return null;
    }

    @Override
    protected void refreshToView(Object dateToView) {
    }

    /**
     * 通过poi搜索获取地址列表。
     *
     * @param isReflsh 是否为刷新数据
     * @param keyWord
     * @param city
     * @param lpTemp
     */
    protected void doGetAddressListBySearchQuery(boolean isReflsh, String keyWord, String city, LatLonPoint lpTemp)
    {
        mQuery = new PoiSearch.Query(keyWord, "", city);//第一个参数表示搜索字符串，第二个参数表示poi搜索类型，第三个参数表示poi搜索区域（空字符串代表全国）
        mQuery.setPageSize(30);// 设置每页最多返回多少条poiitem
        if (isReflsh) {
            searchNowPageNum = 0;
        } else {
            searchNowPageNum++;
        }
        if (searchNowPageNum > searchAllPageNum) {
            return;
        }
        mQuery.setPageNum(searchNowPageNum);// 设置查第一页

        mPoiSearch = new PoiSearch(this, mQuery);
        mMyOnPoiSearchListener.IsReflsh(isReflsh);
        mPoiSearch.setOnPoiSearchListener(mMyOnPoiSearchListener);
        if (lpTemp != null) {
            mPoiSearch.setBound(new PoiSearch.SearchBound(lpTemp, 10000, true));//该范围的中心点-----半径，单位：米-----是否按照距离排序
        }
        mPoiSearch.searchPOIAsyn();// 异步搜索

        // 显示加载进度
        getLocationPOIListUIWrapper.showContent(GetLocationPOIListUIWrapper.ContentType.progress);
    }

    /**
     * 通过经纬度获取地址列表，即逆地址编码。
     *
     * @param latitude
     * @param longitude
     */
    private void doGetAddressListByLatLong(double latitude, double longitude)
    {
        GeocodeSearch geocodeSearch = new GeocodeSearch(this);
        /*
        point - 要进行逆地理编码的地理坐标点。
        radius - 查找范围。默认值为1000，取值范围1-3000，单位米。
        latLonType - 输入参数坐标类型。包含GPS坐标和高德坐标。 可以参考RegeocodeQuery.setLatLonType(String)
        */
        RegeocodeQuery query = new RegeocodeQuery(new LatLonPoint(latitude, longitude), 3000, GeocodeSearch.AMAP);
        geocodeSearch.getFromLocationAsyn(query);
        geocodeSearch.setOnGeocodeSearchListener(mMyOnGeocodeSearchListener);

        // 显示加载进度
        getLocationPOIListUIWrapper.showContent(GetLocationPOIListUIWrapper.ContentType.progress);
    }

    /**
     * 当"我自已的位置"定位成功后要做的事情。
     */
    private void doWhenMyselfLocationSucess()
    {
        AMapLocation location = getMyselfLocationWrapper.getCurrentLocation();

        isSearchData = false;
        currentSelectedPoiItem = LocationUtils.changeToPoiItem(location);
        doGetAddressListBySearchQuery(true, "", location.getCity(), new LatLonPoint(location.getLatitude(), location.getLongitude()));
        moveMapCamera(location.getLatitude(), location.getLongitude());
        refleshDefaultLocationMark(location.getLatitude(), location.getLongitude());
    }

    /**
     * 移动动画
     */
    private void startCenterPinAnimator()
    {
        if (null != mCentPinAnimator && !mCentPinAnimator.isRunning()) {
            mCentPinAnimator.start();
        }
    }

    /**
     * 把地图画面移动到定位地点(使用moveCamera方法没有动画效果)
     *
     * @param latitude
     * @param longitude
     */
    private void moveMapCamera(double latitude, double longitude)
    {
        if (null != mAMap) {
            mAMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), zoom));
        }
    }

    /**
     * 刷新默认位置标识（默认位置即首次进入本界面时定位得到的那个位置）。
     *
     * @param latitude
     * @param longitude
     */
    private void refleshDefaultLocationMark(double latitude, double longitude)
    {
        if (mMyselfLocationMarker == null) {
            mMyselfLocationMarker = mAMap.addMarker(new MarkerOptions()
                    .position(new LatLng(latitude, longitude))
                    .anchor(0.5f, 0.6f)// anchor(..)方法用于设定显示坐标的偏移，0.5f表示居中，详见：http://a.amap.com/lbs/static/unzip/Android_Map_Doc/3D/com/amap/api/maps/model/MarkerOptions.html#anchor-float-float-
                    .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
                            .decodeResource(getResources(), R.drawable.chatting_location_current_flag_icon)))
                    .draggable(true)
            );
        }
        mMyselfLocationMarker.setPosition(new LatLng(latitude, longitude));
//        mAMap.invalidate();
    }

    /**
     * 重置确认为初始状态：不可点击、文字内容显示为"确定"、以及按钮的UI样式为半透明效果。
     */
    private void _resetOkButton()
    {
        this.mBtnOK.setBackgroundResource(R.drawable.common_btn_red_2018_transparent);
        this.mBtnOK.setTextColor(getResources().getColor(R.color.white_50transparent));
        this.mBtnOK.setEnabled(false);
//        this.mBtnOK.setText("确定");
    }

    /**
     * 决置确认按钮的可用性。
     *
     * @param enabled
     */
    private void _setOkButtonEnable(boolean enabled)
    {
        if(enabled)
        {
            this.mBtnOK.setBackgroundResource(R.drawable.common_btn_red_2018);
            this.mBtnOK.setTextColor(getResources().getColor(R.color.white));
            this.mBtnOK.setEnabled(true);
        }
        else
        {
            _resetOkButton();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (null != data && ActivityRequestCode.REQUEST_CODE_FOR_SEARCH_LOCATION == requestCode) {
            try {
                currentSelectedPoiItem = (PoiItem) data.getParcelableExtra(LocationUtils.SEARCH_INFO);
                if (null != currentSelectedPoiItem) {
                    isSearchData = false;
                    doGetAddressListBySearchQuery(true, "", getMyselfLocationWrapper.getCurrentLocation().getCity(), currentSelectedPoiItem.getLatLonPoint());
                    moveMapCamera(currentSelectedPoiItem.getLatLonPoint().getLatitude(), currentSelectedPoiItem.getLatLonPoint().getLongitude());
//                    refleshMark(currentSelectedPoiItem.getLatLonPoint().getLatitude(), currentSelectedPoiItem.getLatLonPoint().getLongitude());
                }
            } catch (Exception ex) {
                Log.w(TAG, ex);
            }
        }
    }


    //------------------------------------------------------------------------ 内部类

    // Poi搜索监听器实现类，可扩展上拉加载数据，下拉刷新
    class MyOnPoiSearchLintener implements PoiSearch.OnPoiSearchListener
    {
        private boolean isReflsh;//是为下拉刷新，否为上拉加载更多

        public void IsReflsh(boolean isReflsh) {
            this.isReflsh = isReflsh;
        }

        @Override
        public void onPoiSearched(PoiResult result, int i)
        {
            if (i == 1000)
            {
                // 搜索poi的结果
                if (result != null && result.getQuery() != null) {
                    searchAllPageNum = result.getPageCount();

                    // 是否是同一条
                    if (result.getQuery().equals(mQuery)) {

                        getLocationPOIListUIWrapper.showContent(GetLocationPOIListUIWrapper.ContentType.data);

                        List<PoiItem> listDatas = getLocationPOIListUIWrapper.getListDatas();

                        if (isReflsh && null != listDatas) {
                            listDatas.clear();
                            if (null != currentSelectedPoiItem) {
                                listDatas.add(0, currentSelectedPoiItem);
                            }
                        }

                        // 取得第一页的poiitem数据，页数从数字0开始
                        listDatas.addAll(result.getPois());

                        if (null != getLocationPOIListUIWrapper.getAddressListAdapter()) {
                            // 刷新列表的ui显示
                            getLocationPOIListUIWrapper.notifyDataSetChanged();
                            // 默认选中第一条
                            getLocationPOIListUIWrapper.getAddressListAdapter().setSelectPosition(0);
                        }
                    }
                }
                else
                    getLocationPOIListUIWrapper.showHintContent("没有返回正确的结果");
            }
            else
            {
                getLocationPOIListUIWrapper.showHintContent(LocationUtils.getSearchResponseErrorCodeDesc(i));
            }
        }

        @Override
        public void onPoiItemSearched(PoiItem poiItem, int i) {

        }
    }
}
